home *** CD-ROM | disk | FTP | other *** search
/ AOL File Library: 2,801 to 2,900 / aol-file-protocol-4400-2801-to-2900.zip / AOLDLs / C++ Files Library / Graphic Gems I, II & III (C_C++) / Graphics Gems C Code.sea / GemsII / viewcorr / viewfind.c < prev   
C/C++ Source or Header  |  1992-06-16  |  5KB  |  183 lines

  1. /* 
  2.  * viewfind.c - Simple program to read view and screen data, then run view
  3.  * correlation on it, and dump the results suitable for a raytracing program.
  4.  * 
  5.  * Author:    Rod G. Bogart
  6.  * Date:    Oct 15 1990
  7.  * Copyright (c) 1990, University of Michigan
  8.  * 
  9.  */
  10. #include <stdio.h>
  11. #include <math.h>
  12. #include "GraphicsGems.h"
  13. #include "matrix.h"
  14. #include "viewcorr.h"
  15.  
  16. main(argc, argv)
  17. char **argv;
  18. {
  19.     ViewData datapts;
  20.     ViewParms view_parms;
  21.     int i, num_iterations = 0;
  22.  
  23.     if (argc >= 2) 
  24.     num_iterations = atoi(argv[1]);
  25.     read_points_and_view(stdin, &datapts, &view_parms );
  26.     iterate_view_parms( &datapts, &view_parms, num_iterations );
  27.     dump_points_and_view(stdout, &datapts, &view_parms );
  28.     dump_rayshade_parms(stdout, &view_parms);
  29. }
  30.  
  31. read_points_and_view( infile, datapts, view_parms )
  32. FILE * infile;
  33. ViewData *datapts;
  34. ViewParms *view_parms;
  35. {
  36.     int i;
  37.     Matrix3 *vm;
  38.     Point3 lookp, up;
  39.     Point3 xvec, yvec, zvec;
  40.  
  41.     /* read viewparms first, then data points */
  42.  
  43.     fscanf(infile,"%lf %lf %lf",&(view_parms->eye.x),&(view_parms->eye.y),
  44.        &(view_parms->eye.z));
  45.     fscanf(infile,"%lf %lf %lf",&(lookp.x),&(lookp.y),&(lookp.z));
  46.     fscanf(infile,"%lf %lf %lf",&(up.x),&(up.y),&(up.z));
  47.  
  48.     /* make coordinate frame unit vectors from eye, lookp, and up */
  49.     V3Sub(&view_parms->eye, &lookp, &zvec);
  50.     V3Normalize( &zvec );
  51.     V3Normalize( &up );
  52.     V3Cross(&up, &zvec, &xvec);
  53.     V3Cross(&zvec, &xvec, &yvec);
  54.     V3Normalize( &xvec );
  55.     V3Normalize( &yvec );
  56.  
  57.     /* Store the coordinate frame unit vectors as columns to create
  58.      * a rotation matrix
  59.      */
  60.     vm = &(view_parms->view);
  61.     vm->element[0][0] = xvec.x;
  62.     vm->element[0][1] = yvec.x;
  63.     vm->element[0][2] = zvec.x;
  64.     vm->element[1][0] = xvec.y;
  65.     vm->element[1][1] = yvec.y;
  66.     vm->element[1][2] = zvec.y;
  67.     vm->element[2][0] = xvec.z;
  68.     vm->element[2][1] = yvec.z;
  69.     vm->element[2][2] = zvec.z;
  70.  
  71.     propagate_rotate_change( view_parms );
  72.  
  73.     fscanf(infile,"%lf %lf",&(view_parms->d_over_s),&(view_parms->aspect));
  74.     fscanf(infile,"%lf %lf %lf %lf",&(view_parms->halfx),&(view_parms->halfy),
  75.        &(view_parms->xcenter),&(view_parms->ycenter));
  76.  
  77.     fscanf(infile,"%d",&datapts->numpts);
  78.     datapts->pts = (Point3 *) malloc(datapts->numpts * sizeof(Point3));
  79.     datapts->scrpts = (Point2 *) malloc(datapts->numpts * sizeof(Point2));
  80.     for(i=0; i < datapts->numpts; i++)
  81.     {
  82.     fscanf(infile,"%lf %lf %lf",&datapts->pts[i].x,&datapts->pts[i].y,
  83.            &datapts->pts[i].z);
  84.     fscanf(infile,"%lf %lf",&datapts->scrpts[i].x,&datapts->scrpts[i].y);
  85.     }
  86. }
  87.  
  88. dump_points_and_view( dumpfile, datapts, view_parms )
  89. FILE * dumpfile;
  90. ViewData *datapts;
  91. ViewParms *view_parms;
  92. {
  93.     int i;
  94.     Matrix3 *vm;
  95.     Point3 dov, tmp, up;
  96.  
  97.     tmp.x = 0.0;
  98.     tmp.y = 0.0;
  99.     tmp.z = -1.0;
  100.     V3MulPointByMatrix(&tmp, &view_parms->viewinv, &dov);
  101.     tmp.x = 0.0;
  102.     tmp.y = 1.0;
  103.     tmp.z = 0.0;
  104.     V3MulPointByMatrix(&tmp, &view_parms->viewinv, &up);
  105.  
  106.     fprintf(dumpfile,"%lf %lf %lf\n",view_parms->eye.x,view_parms->eye.y,
  107.        view_parms->eye.z);
  108.  
  109.     fprintf(dumpfile,"%lf %lf %lf\n",
  110.         view_parms->eye.x + dov.x, 
  111.         view_parms->eye.y + dov.y, 
  112.         view_parms->eye.z + dov.z);
  113.     fprintf(dumpfile,"%lf %lf %lf\n", up.x, up.y, up.z);
  114.  
  115.     fprintf(dumpfile,"%lf %lf\n",view_parms->d_over_s,view_parms->aspect);
  116.     fprintf(dumpfile,"%lf %lf %lf %lf\n",view_parms->halfx, view_parms->halfy,
  117.         view_parms->xcenter, view_parms->ycenter);
  118.  
  119.     fprintf(dumpfile,"%d\n",datapts->numpts);
  120.     for(i=0; i < datapts->numpts; i++)
  121.     {
  122.     fprintf(dumpfile,"%lf %lf %lf ",datapts->pts[i].x,datapts->pts[i].y,
  123.         datapts->pts[i].z);
  124.     fprintf(dumpfile,"%lf %lf\n",datapts->scrpts[i].x,
  125.         datapts->scrpts[i].y);
  126.     }
  127. }
  128.  
  129. dump_rayshade_parms( dumpfile, view_parms )
  130. FILE * dumpfile;
  131. ViewParms *view_parms;
  132. {
  133.     double ds;
  134.     int halfx, halfy;
  135.     Point3 dov, tmp, up;
  136.  
  137.     tmp.x = 0.0;
  138.     tmp.y = 0.0;
  139.     tmp.z = -1.0;
  140.     V3MulPointByMatrix(&tmp, &view_parms->viewinv, &dov);
  141.     tmp.x = 0.0;
  142.     tmp.y = 1.0;
  143.     tmp.z = 0.0;
  144.     V3MulPointByMatrix(&tmp, &view_parms->viewinv, &up);
  145.  
  146.     if (view_parms->halfx > view_parms->xcenter) {
  147.     halfx = (int) (2.0*view_parms->halfx - view_parms->xcenter);
  148.     }
  149.     else
  150.     halfx = view_parms->xcenter;
  151.     if (view_parms->halfy > view_parms->ycenter) {
  152.     halfy = (int) (2.0*view_parms->halfy - view_parms->ycenter);
  153.     }
  154.     else
  155.     halfy = view_parms->ycenter;
  156.     ds = view_parms->d_over_s;
  157.     if (ds < 0.0) {
  158.     V3Negate(&up);
  159.     ds = -ds;
  160.     }
  161.     fprintf(dumpfile,"screen %d %d\n", halfx * 2, halfy * 2);
  162.     fprintf(dumpfile,"window %d %d %d %d\n",
  163.         (int) (halfx - view_parms->xcenter),
  164.         (int) (halfy - view_parms->ycenter),
  165.         (int) (halfx - view_parms->xcenter) + 
  166.         (int) (view_parms->halfx*2 - 1),
  167.         (int) (halfy - view_parms->ycenter) + 
  168.         (int) (view_parms->halfy*2 - 1));
  169.     fprintf(dumpfile,"eyep %lf %lf %lf\n", view_parms->eye.x, 
  170.         view_parms->eye.y, view_parms->eye.z);
  171.     fprintf(dumpfile,"lookp %lf %lf %lf\n",
  172.         view_parms->eye.x + dov.x, 
  173.         view_parms->eye.y + dov.y, 
  174.         view_parms->eye.z + dov.z);
  175.     fprintf(dumpfile,"up %lf %lf %lf\n", up.x, up.y, up.z);
  176.     fprintf(dumpfile,"fov %lf %lf\n",
  177.         atan(((double) halfx / view_parms->halfx) * 
  178.          (1.0/ds)) * RTOD * 2.0,
  179.         atan(((double) halfy / view_parms->halfx) * 
  180.          (1.0/(ds * view_parms->aspect))) * RTOD * 2.0);
  181. }
  182.  
  183.